home *** CD-ROM | disk | FTP | other *** search
/ MacWorld 1997 September / Macworld (1997-09).dmg / Serious Software / Cherwell Scientific Demos / pro Fit / pro Fit 5.0 demo (fpu).sea / pro Fit 5.0 demo (fpu) / External Modules / External modules sources / C / proFit_interface.h < prev    next >
Text File  |  1996-06-01  |  68KB  |  1,780 lines

  1. /***************************************************************************************/
  2. /* proFit_interface.h                                                                  */
  3. /*                                                                                        */
  4. /*                                                                                     */
  5. /* Version history                                                                       */
  6. /* 15.12.95: orig 5.0A9 release                                                         */
  7. /* 20.02.96: added SetWindowInfo, SetBoxTitle, InputBox for strings                       */
  8. /* 10.03.96: added GetFunctionParamName, CancelEvent                                   */
  9. /* 15.03.96: added NumberToStr255, Str255ToNumber                                       */
  10. /* 17.03.96: added GetAndSetStatus                                                       */
  11. /* 24.03.96: added SetTextFileFormat, changed SaveDataAsText                           */
  12. /***************************************************************************************/
  13.  
  14. #ifndef __PROFIT_INTERFACE__
  15. #define __PROFIT_INTERFACE__
  16.  
  17.  
  18. /****************************************************************************************
  19.  
  20. Welcome to the pro Fit external modules!
  21. ---------------------------------------
  22.  
  23. External modules are pieces of code that you produce with your favorite compiler and that
  24. you can build into pro Fit as functions or "user" programs.
  25.  
  26. If it is the first time you do something with external modules and you want to see what is
  27. needed to implement them, just take a look at the example files.
  28.  
  29. For example you might want to study file ErrorFunc.c and look at the functions that are
  30. defined there.
  31.  
  32. Most function names are the same ones used for defining functions and programs
  33. within pro Fit.
  34. To define your own external module, simply fill in these functions with your code.
  35.  
  36. Have a look at the pro Fit user manual for details on the parameter lists of these
  37. functions.
  38.  
  39. In order to build an external function or program, you must compile and link the
  40. following files:
  41.  
  42.      proFit_interface.c            ("glue" code standing between pro Fit and your functions)
  43.      XXXXXX.c                    (your functions, where XXXXXX is a name you define)
  44.  
  45. Of course you can add other files if you need them (such as math.c from the ANSI
  46. libraries). Also, depending on the compiler you use, you may have to add additional
  47. modules containing call glues for system traps (for example, in ThinkC you must add 
  48. "MacTraps" to your project).
  49.  
  50. You must use the following header files:
  51.  
  52.  proFit_interface.h            (This file) contains the definitions of the functions
  53.                              you must define and all the routines provided by pro Fit.
  54.                              These routines implement the functionality of all predefined routines
  55.                              that are available when defining a function or a program
  56.                              within pro Fit. These routines are implemented in
  57.                               proFit_interface.c
  58.  proFit_paramBlk.h            Contains the definition of ExtModulesParamBlock, a struct
  59.                              used to interact with pro Fit and call various pro Fit routines. 
  60.                              Advanced programmers can use this definition if they feel they
  61.                              need to. Using the information given in this file may,
  62.                              however, cause compatibility problems with future versions
  63.                              of pro Fit.
  64.  
  65.  
  66.  
  67.  
  68. Compiling instructions for Power Macintosh (PowerPC):
  69. -----------------------------------------------------
  70.  
  71. Compile your files as a "shared libary" or, more accurately, as an "application
  72. extension". The code should reside in the data fork (not a resource) and it should
  73. export the function main() as it is defined in proFit_interface.c.
  74. The type of the file you create must be 'ftCD', its creator must be 'NLft'.
  75.  
  76.  
  77.  
  78. Compiling instructions for 68XXX:
  79. ---------------------------------
  80.  
  81. Compile your files and link them in a single resource of type 'NLft' (the ID number
  82. can be any number >128 you like). Make sure that your code consists of a single segment.
  83. Refer to your compiler's manual if you don't know how to compile code for a resource.
  84. Put your resource into a file having the type 'ftCD' and the creator 'NLft'.
  85.  
  86.  
  87. Before compiling, make sure that you choose the compiler options that are compatible
  88. with the version of pro Fit you use:
  89.  
  90. If you use the FPU version of pro Fit, make sure that your double variables are 12
  91. bytes long. Under ThinkC, check the options "Generate 68881/882 instructions" and
  92. "Native floating point format" in your compiler options.
  93.  
  94. If you use the non-FPU version of pro Fit, make sure that your double variables are
  95. 10 bytes long. Under ThinkC, uncheck the option "Generate 68881/882 instructions" and
  96. check "Native floating point format" in your compiler options.
  97.  
  98. The external module is a compiled code resource that provides a function called 'main'.
  99. You must make sure that main() is at the beginning of your code. Under Symantec's
  100. compilers, this is done automatically. Under MPW, you must make sure that main()
  101. is the first routine that is compiled and linked.
  102.  
  103. ****************************************************************************************/
  104.  
  105.  
  106.  
  107. /****************************************************************************************
  108.     The following are the type definitions that serve as an interface between the
  109.     external module and pro Fit. These declarations describe exactly how pro Fit
  110.     expects the external module to arrange the information it provides, and how the
  111.     information provided by pro Fit is arranged.
  112.     Don't even think of changing something in this file. The informations it contains
  113.     are vital to the external module in their present, original form. They are deadly if
  114.     you modify them.
  115.     ANY change in a type definition (e.g. changing the ranges of an array or the    
  116.     order of the fields in a record) is guaranteed to cause very ugly consequences.
  117.     
  118.     For a detailed description of these declarations andtheir use, see the
  119.     pro Fit user manual.
  120.  
  121. ****************************************************************************************/
  122.  
  123.     
  124. /*****************  general definitions used by external modules *****************/
  125.  
  126. #ifndef __TYPES__
  127.     #include <types.h>
  128. #endif
  129.  
  130.     enum {isFunction=1, isProgram, isMacro};    /* used in Setup to identify the external module */
  131.  
  132. #define drawingType 'ftGF'         /* window types, used by DoNewWindow, etc.*/
  133. #define dataType 'ftLS'
  134. #define textType 'ftFC'
  135. #define defaultType '****'
  136.  
  137.     enum {    gaussDistr = 1,        /* error distributions, used for setting the parameters of the SetFitDefaults routine */
  138.             doubleExpDistr,
  139.             lorentzDistr,
  140.             andrewDistr,
  141.             tukeyDistrnoErrors
  142.     };
  143.  
  144.     enum {    defaultFormat,        /* Drawing window file formats */
  145.             pictFormat, 
  146.             epsFormat,
  147.                         
  148.             floatColumn=0,        /* data column types */
  149.             doubleColumn=1,
  150.             textColumn = 128
  151.         };
  152.  
  153.     #define noErrors     0    /*    error bar types, used for setting the "errors" parameter in the "errors" parameter in the OpenDataSet routine*/
  154.     #define eBarY         1
  155.     #define eBarX        2
  156.     #define asymmEBarY    4
  157.     #define asymmEBarX    8
  158.  
  159.     #define xAxis    0    /* used for the routines accessing the current x or y axis, such as "SetRange" */
  160.     #define yAxis    1    /* used to distinguish between Y and X axes.                    */
  161.  
  162.     
  163.     #define    equalToMain            1    /*    defines used for setting the "flags" field in calls to the SetAxisAttributes routine */
  164.     #define    drawAxisLine        2
  165.     #define    drawTicks            4
  166.     #define    drawMajorTickLabels    8
  167.     #define    drawMinorTickLabels    0x10
  168.     #define    plusSideTicks        0x20
  169.     #define    minusSideTicks        0x40
  170.     #define    plusSideLabels        0x80
  171.     #define    labelsOutsideFrame    0x0100
  172.  
  173.     
  174.     #define    drawFrame            2    /*    defines used for setting the "flags" field in calls to the SetGraphAttributes routine */
  175.     #define    drawMajorGridX        4
  176.     #define    drawMinorGridX        8
  177.     #define    drawMajorGridY        0x10
  178.     #define    drawMinorGridY        0x20
  179.     #define    plotBehindAxes        0x40
  180.     #define    gridInFront            0x80
  181.     #define    gridInMiddle        0x0100
  182.  
  183.     #define maxNrParams  64            /* the maximum number of parameters of a function */
  184.     #define    maxParamNameLength  31    /* the maximum length of a parameter name  */
  185.  
  186.  
  187.     #define    maxNrInputValues   6    /* the maximum number of input values in the input dialog box */
  188.  
  189. #if defined(powerc) || defined (__powerc)
  190. #pragma options align=mac68k
  191. #endif
  192.         typedef struct                    /* definition used by the function "InputBox"*/
  193.         {               double* x;            /* pointer to value or string (if s starts with $S */
  194.                         unsigned char* s;
  195.         } InputRec[maxNrInputValues];   
  196.  
  197. #if defined(powerc) || defined (__powerc)
  198. #pragma options align=reset
  199. #endif
  200.  
  201. /************* type definitions for "GetDefaultData" **************/
  202.  
  203.     typedef struct         /* this data structure can be used when calling GetDefaultData.    */
  204.     {
  205.         double    xMin,xMax,xPosMin,xNegMax;    /* set if the "x" array was calculated        */
  206.         double    yMin,yMax,yPosMin,yNegMax;    /* set if the "y" array was calculated        */
  207.     
  208.         Boolean ordered;                /* true if the x-array is ordered such that x[i+1]>=x[i], for all i.        */
  209.     
  210.         Boolean zeroYErrors;            /* true if at least one y-error is 0        */
  211.         Boolean invalidYErrors;            /* true if at least one y-error is invalid or 0        */
  212.         Boolean zeroXErrors;            /* true if at least one x-error is 0        */
  213.         Boolean invalidXErrors;            /* true if at least one x-error is invalid or 0        */
  214.     }    DataInfo;
  215.  
  216.     typedef double                 DoubleArray[1];            /* variable size array of native double numbers */
  217.     typedef long                 LongArray[1];            /* variable size array of long numbers */
  218.     typedef DoubleArray**         DoubleArrayHandle;        /* Handle to an array of double */    
  219.     typedef LongArray**         LongArrayHandle;        /* Handle to an array of long    */
  220.  
  221.  
  222. /************* type definitions for "GetColHandle/SetColHandle" ***************/
  223.  
  224. #if defined(powerc) || defined (__powerc)
  225. #pragma options align=mac68k
  226. #endif
  227.     typedef struct                            /* the data structure of a column of strings. Warning: this data structure may change in future releases of pro Fit        */
  228.     {    long        size;                    /* the size of valid data in this handle             */
  229.         long        nrRows;                    /* the number of rows in this handle         */
  230.         long        firstOffset;            /* reserved         */
  231.         short        firstRow;                /* reserved         */
  232.         Str255        data;                    /* here follow the strings, packed, one after another         */
  233.     } StringData;
  234. #if defined(powerc) || defined (__powerc)
  235. #pragma options align=reset
  236. #endif
  237.  
  238. #if defined(powerc) || defined (__powerc)
  239.     typedef double double_8;                /* a 8 byte floating point number */
  240. #else
  241.     typedef short double double_8;            /* a 8 byte floating point number */
  242. #endif
  243.  
  244.     typedef float                 FloatColumnArray[1];    /* a variable size array of 4 byte doubles */
  245.     typedef double_8             DoubleColumnArray[1];    /* a variable size array of 8 byte doubles */
  246.     typedef FloatColumnArray**     FloatColumnHandle;        /* column handle for columns of type floatColumn */
  247.     typedef DoubleColumnArray** DoubleColumnHandle;        /* column handle for columns of type doubleColumn */
  248.     typedef StringData**         TextColumnHandle;        /* column handle for columns of type textColumn */
  249.  
  250.  
  251.     typedef enum {update, good, bad} CheckPAnswer;            /*the possible return values of the 'check' function, only used when the external module is a function  */    
  252.  
  253.     typedef unsigned char ParamName[maxParamNameLength+1];    /* the names of the prameters */
  254.     enum {active, inactive, constant};                        /* the fitting state of a parameter, used to set variables of type ParamMode  */
  255.     typedef char ParamMode;                                    /* the fitting mode of a parameter (active, inactive, constant) */
  256.  
  257.     typedef double ParamArray[maxNrParams];                    /* an array to hold the parameters */
  258.     typedef ParamMode ParamModeArray[maxNrParams];            /* the fitting modes of the parameters, {active, inactive, constant} */
  259.     typedef ParamName ParamNameArray[maxNrParams];            /* the names of the parameters */
  260.  
  261. #if defined(powerc) || defined (__powerc)
  262. #pragma options align=mac68k
  263. #endif
  264.     typedef struct
  265.     {
  266.         ParamArray*        value;        /* the default value of the parameters as they appear in params window */     
  267.         ParamArray*        lowest;        /* the lowest allowed value (for fitting)              */
  268.         ParamArray*        highest;    /* the highest allowed value (for fitting)              */
  269.         ParamModeArray*    mode;        /* the fitting mode of the parameters                */
  270.         ParamNameArray*    name;        /* their names */
  271.     } DefaultParamInfo;
  272.     
  273.     typedef double GlobalArrayType[100];
  274.     
  275.     typedef struct
  276.     {    long                globalScratch1;        /* freee for use in external modules */
  277.         long                globalScratch2;        /* freee for use in external modules */
  278.         long                globalDataSize;        /* the number of entries in the following array */
  279.         GlobalArrayType**    globalData;            /* array of doubles to be accessed by external and interal programs */
  280.     }GlobalScratch;
  281.  
  282. #if defined(powerc) || defined (__powerc)
  283. #pragma options align=reset
  284. #endif
  285.  
  286.  
  287.  
  288. #include "proFit_paramBlk.h"
  289.  
  290.  
  291.  
  292. /************************************************************************************************/
  293. /******************* functions that must be supplied by the external module *********************
  294.  
  295.      the following are all the functions that the external module must, or can, supply.
  296.     They are used in the procedure main, defined in profit_interface.c.
  297.     
  298.     All you need to know to program an external module for pro Fit are these
  299.     prototypes.
  300.     
  301.     Just fill-in your code in the template files provided (FunctionTemplate.c and ProgramTemplate.c)
  302.  
  303. ************************************************************************************************/
  304.  
  305.  
  306.  
  307. /********* ROUTINES USED BY ALL EXTERNAL MODULES (both functions and programs) ***************/
  308.  
  309. void SetUp (    short* const moduleKind,        /* set moduleKind to isFunction or isProgram */
  310.                 Str255 name,                    /* the name of the program or function (pascal string) */
  311.                 long* const requiredGlobals,    /* the number of bytes to be allocated in ExtModulesParamBlock.globals */
  312.                                                 /* set requiredGlobals to 0 if you don't use this feature */
  313.                 ExtModulesParamBlock* pb);        /* the complete parameter block passed by pro Fit to the */
  314.                                                 /* routines defined in this file. In most cases it can be ignored */
  315. /* SetUp is called once when the external module is linked to proFit */
  316.  
  317.  
  318. void CleanUp (ExtModulesParamBlock* pb);
  319.     /* called when the function or program is removed from pro Fit's menus */
  320.     /* in most cases, this function can be empty */
  321.  
  322.  
  323.  
  324. /************   ROUTINES USED WHEN THE EXTERNAL MODULE IS A FUNCTION ******************/
  325. void InitializeFunc (
  326.                 Boolean* const hasDerivatives,    /* set this to true if you do calculate some derivatives (dyda[]) in the */
  327.                                                 /* "Derivatives" function you define. Any derivatives you don't calculate will be calculated numerically by pro Fit */
  328.                 Str255 descr1stLine,            /* first line of the text in the parameter window */
  329.                 Str255 descr2ndLine,            /* second line of the text in the parameter window */
  330.                 short* const numberOfParams,    /* the number of parameters of the function */
  331.                 DefaultParamInfo* const a0,        /* the default names, values etc. of the parameters */
  332.                 ExtModulesParamBlock* pb);        /* the complete parameter block passed by pro Fit to the */
  333.                                                 /* routines defined in this file. In most cases it can be ignored */
  334. /* InitializeFunc is called once (after SetUp has been called) when the external module is linked to proFit */
  335. /* Used to set all the information needed to describe a function */
  336.  
  337. short Check(short paramNo,                        /* the parameter that was changed */
  338.                 DefaultParamInfo* const a0,        /* the default names, values etc of the paramters */
  339.                 ExtModulesParamBlock* pb);        /* the complete parameter block passed by pro Fit to the */
  340.                                                 /* routines defined in this file. In most cases it can be ignored */
  341.     /* Can be left emtpy (returning good) if not needed. */
  342.     /* called when the user has changed a value in the parameters window. This routine */
  343.     /* can then check if this parameters is fine. It can also change some of the */
  344.     /* other entries in a0. The returned values can be: */
  345.     /*    good:        return this value if you agree with the new parameter value */
  346.     /*    update:        return this value if you want the parameters window */
  347.     /*                to be updated because you changed some of the values in a0 */
  348.     /*    bad:        return this value if you want the new parameter value to be refused */
  349.  
  350. void First (    ParamArray a,                /* the new parameters */
  351.                 ExtModulesParamBlock* pb);    /* the complete parameter block passed by pro Fit to the */
  352.                                             /* routines defined in this file. In most cases it can be ignored */
  353.     /* Can be left emtpy if not needed. */
  354.     /* Called whenever the parameters are changed. Can be used to accelerate */
  355.     /* some calculations. See manual for more info */
  356.  
  357. void Func (        double x,                        /* the x-value */
  358.                 ParamArray a,                    /* the parameters */
  359.                 double* const y,                /* the y-value to be returned */
  360.                 ExtModulesParamBlock* pb);        /* the complete parameter block passed by pro Fit to the */
  361.                                                 /* routines defined in this file. In most cases it can be ignored */
  362.     /* called to calculate the y-value of the function for a given x and a given */
  363.     /* set of parameters */
  364.  
  365. void Derivatives(double x,                        /* the x-value */
  366.                 ParamArray a,                    /* the parameters */
  367.                 ParamArray dyda,                /* the derivatives to be returned */
  368.                 ExtModulesParamBlock* pb);        /* the complete parameter block passed by pro Fit to the */
  369.                                                 /* routines defined in this file. In most cases it can be ignored */
  370.     /* called to calculate the partial derivatives of the function with respect to */
  371.     /* its parameters. The elements of the array "dyda[i]" must be set to the derivatives of    */
  372.     /* the function with respect to parameter number "i". If any dyda[i] is not set by     */
  373.     /* this function, then the derivatives will be calculated numerically by pro Fit. */
  374.     /* If you set hasDerivatives to false in FuncInitialize, then ALL derivatives will always */
  375.     /* be calcuated numerically by pro Fit, no matter what you do in the function "Derivatives" */
  376.     /* If a derivative is too complicated to be calculated analytically, then don't set the */
  377.     /* corresponding "dyda". pro Fit will notice this and calculate that derivative numerically. */
  378.     /* If you are able to calculate the dyda analytically, do so! By doing this you will make */
  379.     /* fitting much, much faster. */
  380.     
  381. void Last (ExtModulesParamBlock* pb);
  382.     /* Can be left emtpy if not needed. */
  383.     /* Called when calculating is through. See manual for more info */
  384.  
  385.  
  386. /************   ROUTINES USED WHEN THE EXTERNAL MODULE IS A PROGRAM ******************/
  387.  
  388. void InitializeProg (ExtModulesParamBlock* pb);
  389.     /* Can be left emtpy if not needed. */
  390.     /* called when the resource is linked to proFit after SetUp was called */
  391.     /* can be used to inititialize global variables, etc. */
  392.  
  393.  
  394. void Run(ExtModulesParamBlock* pb);
  395. /* pro Fit calls this function when the name of the program is chosen from the Misc Menu*/
  396.  
  397.  
  398.  
  399.  
  400. /* utility function, you can use it if you need it... */
  401. void SetPascalStr(Str255 s1, const Str255 s2, short limit);
  402.     /* copies s2 to s1, makes sure that s1 is shorter than limit */
  403.  
  404. /* function used internally in proFit_Interface.c  */
  405. ExtModulesParamBlock* GetPb(void);
  406.     /* Returns the parameter block as passed to main(). Only advanced */
  407.     /* programmers may need this function. */
  408.     /* WARNING: the definition of ExtModulesParamBlock may change in future versions */
  409.     /* of pro Fit. Using it from within your function may cause compatibility problems */
  410.     /* with those future versions. */
  411. /*************************************************************************************/
  412.  
  413.  
  414.  
  415.  
  416.  
  417.  
  418.  
  419. /****************************************************************************************/
  420. /****************************************************************************************/
  421. /****************************************************************************************
  422.  
  423.                      Prototypes of all routines provided by pro Fit. 
  424.                      
  425.                      
  426.      For an explaination of the meaning of the various parameters and the return values see 
  427.      the pro Fit user manual.        
  428. */
  429.  
  430.  
  431.  
  432. /********************************************************************************/
  433. /********************************** input/output ********************************/
  434.  
  435.  
  436.  
  437. short InputBox(short numItems, InputRec* r);
  438.     /* 
  439.         Shows a dialog box with nrArgs (between 1 and 6=maxNrInputValues) input values
  440.         r contains a title and a numeric field for every argument
  441.         The default way to display an input value is an numberic edit field with a title
  442.         If the title 'ttt' starts with a '$' other interface elements are displayed:
  443.         - '$Wttt' shows a popup menu to select a data window
  444.         - '$Cttt' shows a popup menu to select a column
  445.         - '$Pmmm$ttt' shows a user defined popup menu 'mmm' (each entry separated by a ';')
  446.         - '$Xttt' shows a check box
  447.         - '$Sttt' shows an edit field to input a string
  448.         InputBox returns 0 if user pressed ok, 1 if user pressed stop
  449.     */
  450.  
  451. void SetBoxTitle(const Str255 title);
  452.     /*
  453.         Sets the title of the dialog box in the next call to InputBox.
  454.         By default, this box does not have a title.
  455.     */
  456.  
  457. short AlertBox(const Str255 m);
  458.     /* 
  459.         shows an alert box with a message m (pascal string) 
  460.         AlertBox returns 0 if user pressed ok, 1 if user pressed stop  
  461.     */
  462.  
  463. short AskBox(short* const answer, const Str255 message);
  464.     /* 
  465.         shows an alert box with a Yes and a No button and displays "message"
  466.         answer is 0 for No and 1 for Yes or Stop
  467.         The return value is 0 if user pressed Yes or No, 1 if user pressed stop  
  468.     */
  469.     
  470.             
  471. void Write(const Str255);
  472.     /* writes a string (pascal string) to the results window */
  473.  
  474. void Writeln(const Str255);
  475.     /* writes a string (pascal string) to the results window and goes to next line */
  476.  
  477. void WriteText(long length, unsigned char * theText);
  478.     /* writes a text to the results window. the pointer theText points to the first */
  479.     /* character of the text. "length" must give the length of the text                 */
  480.  
  481. void WriteInt(long i);
  482.     /* writes an integer value to the results window */
  483.  
  484. void WriteNumber(double d);
  485.     /* writes a floating point value to the results window */
  486.  
  487. void NumberToStr255(double x, Str255 s, short format, short digits);
  488.     /* converts the number x into a string */
  489.     /* format/digits: controls the conversion process. */
  490.     /*    format = 0:         normal conversion */
  491.     /*                    if digits>0: the number of digits after the '.', */
  492.     /*                    if digits<0: the total number of digits (approx.) */
  493.     /*  format = 1:        optimized conversion, removes unnecessary trailing zeros after */
  494.     /*                    the decimal point, leading spaces, unecessary '+'-signs, etc */
  495.     /*                    digits: the number of digits */
  496.  
  497. short Str255ToNumber(Str255 s, double* const x);
  498.     /* converts string s to a number x. s can be a numeric string or an expression */
  499.     /* return values: */
  500.     /*    0:        conversion successful */
  501.     /*    1:        x is infinite */
  502.     /*    2:        s is empty */
  503.     /*    3:        x is an NAN (invalid number) */
  504.     /*    4:        user aborted calculation */
  505.     /*    5:        run time error */
  506.  
  507.  
  508. /********************************************************************************/
  509. /**********   redirecting text to the results window or to text files ***********/
  510.     
  511. long CreateTextFile(const Str255 fileName);
  512.     /*
  513.         creates a text file with the given name and returns a
  514.         reference number used to identify this file.
  515.         Call the routine WriteToTextFile() to redirect the
  516.         output from calls to write/writln/writenumber into this file.
  517.     */
  518.     
  519. void CloseTextFile(long fileRefNumber);
  520.     /*
  521.         Closes the text file with the given reference number. 
  522.         The calls to write/writln/writenumber is redirected back to
  523.         the results window.
  524.     */
  525.     
  526. void WriteToTextFile(long fileRefNumber);
  527.     /*
  528.         redirects the output of the pro Fit "write/writeln/writenumber"
  529.         routines to the given text file.
  530.          
  531.         call this routine with fileRefNumber==0 to direct the text
  532.         writing routines back to the results window.
  533.     */
  534.  
  535.  
  536.  
  537. /********************************************************************************/
  538. /**************** window and document management routines ***********************/
  539.  
  540. long GetFrontWindow(void);
  541.     /*
  542.         Returns the identification number of the frontmost window
  543.     */
  544.     
  545. void DoNewWindow(long windowType);
  546.     /*
  547.         creates a new window. windowType can take one of the following values:
  548.             drawingType:    create a drawing window
  549.             dataType:        create a data window
  550.             textType        create a text window
  551.     */
  552.  
  553. void SetCurrentWindow(long    windowID);
  554.     /*
  555.         makes the window with the given ID number the current window to
  556.         be used for data, plotting, writing, etc, depending on its type.
  557.     */
  558.  
  559. long GetCurrentWindow(long windowType);
  560.     /*
  561.         returns the ID number of the current window of the given type
  562.         windowType can take one of the following values
  563.             drawingType:    return the current drawing window
  564.             dataType:        return the current data window
  565.             textType        return the current text window
  566.     */
  567.  
  568. void DoCloseWindow(long windowID, Boolean saveIt);
  569.     /*
  570.         closes the window with the given ID number.
  571.         saves the contents of the window if saveIt is true
  572.     */
  573.  
  574. long FrontmostWindow(long windowType);
  575.     /*
  576.         returns the ID number of the front most window with the given type
  577.             drawingType:    return the frontmost drawing window
  578.             dataType:        return the frontmost data window
  579.             textType        return the frontmost text window
  580.     */
  581.  
  582. void SaveWindow(long windowID);
  583.     /*
  584.         saves the contents of the given window in the file associated with it
  585.     */
  586.  
  587. void SaveWindowAs(long windowID, const Str255 fileName);
  588.     /*
  589.         saves the contents of the given window in the file.
  590.         fileName: the files name. If fileName does not contain a file path, the file
  591.             is expected to reside in the same folder as pro Fit. Alternatively, you
  592.             can specify a file path, such as "\pHD:MyFolder:My File".
  593.             if fileName is an empty string, the window is saved in a file having the name of the window
  594.             if fileName is "\p?", a dialog box is brought up to ask for user for a name
  595.     */
  596.  
  597. long GetWindowID(const Str255 windowName);
  598.     /*
  599.         returns the ID number of the window with the given name.
  600.         returns 0 if no such window is found.
  601.     */
  602.  
  603. long GetWindowType(long windowID);
  604.     /*
  605.         returns the type of the window with the given ID number
  606.         returns 0 if the given window is not a text, drawing or data window
  607.                   or if there is no window exists with the given ID number
  608.     */
  609.     
  610. long NextWindow(long windowID);
  611.     /*
  612.         returns the ID number of the window immediately behind the given window
  613.         returns 0 if the given window is the last one
  614.         returns the front window if 0 is passed for the windowID.
  615.         returns 0 and causes run-time error if the windowID it receives is invalid
  616.     */
  617.  
  618. void OpenFile(const Str255 fileName);
  619.     /*
  620.         Opens the given file in a new window.
  621.         fileName: the files name. If fileName does not contain a file path, the file
  622.         is expected to reside in the same folder as pro Fit. Alternatively, you
  623.         can specify a file path, such as "\pHD:MyFolder:My File".
  624.         Set name to "\p?" for bringing up a dialog box prompting the user for the name.
  625.         A run-time error occurs if the file cannot be opened.
  626.     */
  627.  
  628. void OpenData(const Str255 fileName);
  629.     /*
  630.         Opens the given file as a data file. The file must either be a pro Fit data
  631.         file or a text file with valid data.
  632.         fileName: the files name. If fileName does not contain a file path, the file
  633.         is expected to reside in the same folder as pro Fit. Alternatively, you
  634.         can specify a file path, such as "\pHD:MyFolder:My File".
  635.         Set name to "\p?" for bringing up a dialog box prompting the user for the name.
  636.         A run-time error occurs if the file cannot be opened.
  637.     */
  638.  
  639. void OpenText(const Str255 fileName);
  640.     /*
  641.         Opens the given file as a text file. The file must either be a pro Fit function
  642.         file or a text file.
  643.         fileName: the files name. If fileName does not contain a file path, the file
  644.         is expected to reside in the same folder as pro Fit. Alternatively, you
  645.         can specify a file path, such as "\pHD:MyFolder:My File".
  646.         Set name to "\p?" for bringing up a dialog box prompting the user for the name.
  647.         A run-time error occurs if the file cannot be opened.
  648.     */
  649.  
  650. void SetTextFileFormat(const Str255 colDelimiter,
  651.                         const Str255 endOfLine,
  652.                         Boolean withColTitles,
  653.                         Boolean copyInfoText,
  654.                         long nrHeaderLines,
  655.                         long inputORoutput);
  656.     /*
  657.         colDelimiter:    inserted between consecutive cells in the same row.
  658.                         Usually, you will specify a tab character by passing "\p\t"
  659.         endOfLine:        inserted between the last cell of a row and the first cell
  660.                         of a next row. Usually, you will specify the CR character
  661.                         by passing "\p\15"
  662.         withColTitles:    pass true if the column titles should be saved / loaded
  663.                         as the (first) row of the file.
  664.         copyInfoText:    pass true if the text in the info field of the data window
  665.                         should be saved / loaded at the beginning of the file
  666.         nrHeaderLines:    number of header lines contained in the text file when loading.
  667.                         If copyInfoText is true, these lines are copied to the info
  668.                         field, otherwise they are skipped.
  669.         inputORoutput:    pass 1 to define the format of an input file (loading),
  670.                         pass 0 to define the format of an output file (saving).
  671.     */
  672.  
  673. void SaveDataAsText(long windowID, const Str255 fileName);            
  674.     /*
  675.         saves the contents of the data window in a file.
  676.         fileName: the file's name. If fileName does not contain a file path, the file
  677.             is expected to reside in the same folder as pro Fit. Alternatively, you
  678.             can specify a file path, such as "\pHD:MyFolder:My File".
  679.             if fileName is an empty string, the window is saved in a file having the name of the window
  680.             if fileName is "\p?", a dialog box is brought up to ask for user for a name
  681.         The individual cells will be stored row by row.
  682.         To set the format of the text file, use SetTextFileFormat
  683.     */
  684.  
  685. void SaveDrawingAs(long windowID, const Str255 fileName,long format);
  686.     /*
  687.         saves the contents of the drawing window in a file.
  688.         fileName: the file's name. If fileName does not contain a file path, the file
  689.             is expected to reside in the same folder as pro Fit. Alternatively, you
  690.             can specify a file path, such as "\pHD:MyFolder:My File".
  691.             if fileName is an empty string, the window is saved in a file having the name of the window
  692.             if fileName is "\p?", a dialog box is brought up to ask for user for a name
  693.         format:    0 for saving the file in a standard pro Fit drawing file
  694.                 1 for saving the file as picture (having a file type PICT)
  695.                 2 for saving the fiel as eps-file (having a file type EPSF)
  696.     */
  697.  
  698. void SetWindowTitle(long windowID, const Str255 name);
  699.     /*
  700.         sets the title of a given window. The title should not contain a ':'
  701.     */
  702.  
  703. void GetWindowTitle(long windowID, Str255 name);
  704.     /*
  705.         returns the title of the window with the given windowID
  706.     */
  707.  
  708. void SetWindowInfo(long windowID, long length, Ptr info);
  709.     /*
  710.         Sets the info of a window. (The "info" of a window can be viewed by using the
  711.         Get Info... command from the File menu. For data windows, it is the
  712.         text that appears when you drag down the info field.)
  713.         windowID: the id of the window
  714.         length: the length of the text in bytes
  715.         info: a pointer to the start of the text
  716.         Use SetWindow(windowID, 0, nil) for clearing the info field.
  717.     */
  718.  
  719. void PlaceWindow(long windowID, Rect windowRect);
  720.     /*
  721.         resizes and positions the window according to windowRect
  722.     */
  723.  
  724.  
  725. void BringWindowToFront(long windowID);
  726.     /*
  727.         the window with the given ID number is brought in front of all others.
  728.     */
  729.  
  730. void Compile(long windowID);
  731.     /*  
  732.         Compiles the text found in the given window.
  733.         Causes a run error if the given window is not a function window or if
  734.         the text is not compiled successfully.
  735.     */
  736.  
  737.  
  738.  
  739.  
  740.  
  741.  
  742.  
  743. /********************************************************************************/
  744. /************************** drawing and plotting ********************************/
  745.  
  746. void OpenCurve(const Str255 curveName);
  747.     /*
  748.         Starts a new function curve definition in the current graph. After this call,
  749.         all moveto/lineto calls will generate lines in the current graph.
  750.         The function curve will use the current style/color, set by SetLineStyle/SetLineColor
  751.         curveName is the name that will appear in the legend (pascal string).
  752.         Call CloseCurve once you are finished.
  753.  
  754.         This function replaces the obsolete "NewCurve" function, used in earlier versions
  755.         
  756.     */
  757.  
  758. void CloseCurve(void);
  759.     /*
  760.         Matches the "OpenCurve" call. Stops collecting moveto/lineto calls
  761.         as a definition of a function curve in the current graph.
  762.         Call once you are finished defining a curve in the current graph.
  763.     */
  764.     
  765.  
  766. void OpenDataSet(short errors, Boolean connected, const Str255 datasetName);
  767.     /*
  768.         Starts a new data set definition in the current graph. After this call,
  769.         all DrawDataPoint calls will generate data points in the current graph.
  770.         AddDataPoint is also used for the same purposes, if you want to add error
  771.         bars to the data point.
  772.         The data set will use the current style/color, set by SetLineStyle/SetLineColor
  773.         datasetName is the name that will appear in the legend.
  774.         Call CloseDataSet once you are finished.
  775.         errors:        used to specify if the new data set will use error bars or not.
  776.                     pass 0 if you don't plan to use error bars,
  777.                     pass a sum of eBarY, eBarX, asymmEBarY, asymmEBarX to specify which
  778.                     kind of error bars you will use.
  779.         connect:    set to true if you want a line to coonnectthe data points.
  780.         
  781.         Example
  782.             "eBarY+asymmEBarX" tells proFit that it has to allocate space for
  783.             holding the value of the y error bar and the two values corresponding
  784.             to the left and right part of an x error bar.
  785.             When you then call AddDataPoint, the parameters yErr, xErr, and xErr1
  786.             will be interpreted by proFit.
  787.         
  788.         This function replaces the obsolete "NewDataSet" function, used in earlier versions
  789.  
  790.     */
  791.     
  792.     
  793. void CloseDataSet(void);
  794.     /*
  795.         Matches the "OpenDataSet" call. Stops collecting AddDataPoint/DrawDataPoint calls
  796.         as a definition of a data set in the current graph.
  797.     */
  798.  
  799. void SetCurveFill(short whichAxis, short axisID);
  800.     /*
  801.         switches on the filling style for curves that will be created in the current
  802.         graph using the OpenDataSet and OpenCurve functions.
  803.         the parameters to this routine specify the axis towards which the filling is
  804.         applied. use axisID==0 to swich off filling.
  805.         Specify the filling color using the "SetFillColor" routine.
  806.     */
  807.     
  808. void SetEBarStyle(double caplength, double capThick, double lineThick);
  809.     /*
  810.         sets the default error bar style used for producing error bars in the next
  811.         data set created in the current graph using the OpenDataSet call
  812.     */
  813.     
  814. void AddDataPoint(double x, double y, double xErr, double yErr, double xErr1, double yErr1);
  815.     /*
  816.         Adds a data point at the given coordinates and with the given error to the
  817.         current data set in the current graph.
  818.         The error-parameters are interpreted in the way specified by setting the
  819.         "errors" parameter in the NewDataSet call.
  820.  
  821.         If you don't use error bars you can call the "DrawDataPoint" routine instead of AddDataPoint
  822.     */
  823.  
  824. void GrMoveTo (double x, double y);
  825.     /* 
  826.         set current point to x,y
  827.     */
  828.  
  829. void GrLineTo (double x, double y);
  830.     /* 
  831.         add a line from current point to x,y 
  832.     */
  833.  
  834. void GrMove (double x, double y);
  835.     /* 
  836.         add x, y to the current point.
  837.     */
  838.  
  839. void GrLine (double x, double y);
  840.     /* 
  841.         add a line starting from current point, x,y  long
  842.     */
  843.  
  844.  
  845. void GetGraphCoordinates (double* const xmin, double* const xmax,
  846.                          double* const ymin, double* const ymax);
  847.     /* 
  848.         returns the axes limits of the current graph 
  849.     */
  850.     
  851. void CreateNewGraph(double xmin, double xmax, double ymin, double ymax, short xScaling, short yScaling);
  852.     /* 
  853.         creates a new, empty graph with the given ranges 
  854.         produces a run-time error if  the ranges and scaling are inconsistent 
  855.         xScaling/yScaling     = 0    : linear
  856.                             = 1    : log
  857.                             = 2    : 1/x
  858.                             = 3    : probability
  859.     */
  860.  
  861.  
  862. void SetLineStyle(double thick, short dash);
  863.     /*
  864.         Sets the default line style that will be used for drawing and plotting.
  865.         thick:    the thickness of the line in points,
  866.         dash:    the dash pattern, given by the item number in the dash popup menu
  867.     */
  868.     
  869. void SetFillPattern(short pattern);
  870.     /*
  871.         Sets the default fill pattern.
  872.         pattern:    the fill pattern, given by the item number in the corresponding popup menu
  873.     */
  874.     
  875. void SetArrowStyle(short arrowLocation, short style, double size);
  876.     /*
  877.         Sets the default arrow style.
  878.         You can define different arrows for line start and line end.
  879.         arrowLocation:    1: at start, 2: at end, 3: both start and end
  880.         style:            0: no arrow, 1..12: the item number in the arrow popup menu.
  881.         size:            the size of the arrow in points, as it would appear in the custom arrow dialog box.
  882.     */
  883.     
  884. void SetTextStyle(const Str255 fontName, double size, short style);
  885.     /*
  886.         Sets the default text style.
  887.         supply a font name, its size, and style.
  888.         size and style are the same parameters you can pass to the MacOS routines "TextSize" and "TextFace"
  889.     */
  890.  
  891. void SetNewGraphRect(double left, double top, double right, double bottom);
  892.     /*
  893.         Sets the default rectangle used for creating new graphs in the drawing window.
  894.     */
  895.  
  896. void SetDataPointStyle(short style, double size, double thickness);
  897.     /*
  898.         Sets the default data point style.
  899.         style gives the item number in the data points popup menu
  900.         style:    0:pixel, 1-13: row number in data pont menu, 14-17: points in the last row, second column
  901.                 -1..-8: the 8 custom points in the separate section
  902.         size:    the size of the point in points, same as the one which is given in the custom data point symbols dialog box.
  903.         thickness:    the line thickness used to draw empty data point symbols.
  904.     */
  905.     
  906. void SetBGDataPointStyle(short style, double size);
  907.     /*
  908.         Can be used in conjunction with SetDataPointStyle to set the default data pont style.
  909.         Substitutes the background symbol of the current data point style with the one
  910.         given.
  911.         style and size are interpreted in the same way as for the SetDataPointStyle routine
  912.     */
  913.  
  914. void SetLineColor(long red, long green, long blue);
  915.     /*
  916.         Sets the default line color, used for lines and text.
  917.         red, green, blue give the RGB value of the color (0<red,green,blue<65536)
  918.     */
  919.     
  920. void SetFillColor(long red, long green, long blue);
  921.     /*
  922.         Sets the default fill color, used to fill drawing shapes or for curves in plots.
  923.         red, green, blue give the RGB value of the color (0<red,green,blue<65536)
  924.     */
  925.     
  926. void DrawRect(double left, double top, double right, double bottom);
  927.     /*
  928.         Creates a rectangle with the given coordinates in the current drawing window
  929.     */
  930.     
  931. void DrawEllipse(double left, double top, double right, double bottom);
  932.     /*
  933.         Creates an ellipse with the given coordinates in the current drawing window
  934.     */
  935.     
  936. void DrawLine(double start_h, double start_v, double end_h, double end_v);
  937.     /*
  938.         Creates a line with the given coordinates in the current drawing window
  939.     */
  940.     
  941. void DrawTextLine(const Str255 theString, double theAngle, Boolean docenter);
  942.     /*
  943.         Creates a text-label at the given coordinates in the current drawing window,
  944.         with the given rotation angle.
  945.         rotation is around center if docenter is true.
  946.     */
  947.     
  948. void DrawNumber(double theNum, short decs, double theAngle, Boolean docenter);
  949.     /*
  950.         Converts the number into a text with the given number of decimals, and
  951.         creates a text-label at the given coordinates in the current drawing window,
  952.         with the given rotation angle.
  953.         rotation is around center if docenter is true.
  954.     */
  955.     
  956. void DrawDataPoint(double x, double y);
  957.     /*
  958.         Draws a data point symbol at the coordinates given, using the current 
  959.         data point style.
  960.         if OpenDataSet was called, then it creates a data point in the current plot,
  961.         adding it to the current data set.
  962.     */
  963.  
  964. void DrawPICT(double left, double top, double right, double bottom, PicHandle thePict);
  965.     /*
  966.         Creates a new picture in the current drawing window using the 
  967.         MacOS PicHandle "thePict".
  968.         Once you call this routine, the handle thePict BECOMES PROPERTY 
  969.         of pro Fit — DO NOT DISPOSE IT!
  970.         left and top give the coordinates of the picture.
  971.         right and bottom are used to define the size of the picture if they are larger
  972.         than left and top, respectively.
  973.         Otherwise the size information containd in the PicHandle passed you pass is used.
  974.     */
  975.  
  976. void GetLastClickedCoordinates(double* x, double* y);
  977.     /*
  978.         returns the screen-coordinates that were last clicked by the user
  979.     */
  980.     
  981.     
  982. void DisableDrawingUpdates(void);
  983.     /*
  984.         Inhibits updates in the current drawing window until your program is finished.
  985.         Call this if you are drawing lots of stuff and you want to do it as fast as
  986.         possible.
  987.     */
  988.     
  989. void OpenPolygon(short smoothing, short kind);
  990.     /*
  991.         Opens a new polygon definition, which can then be defined by moveto/lineto calls.
  992.         smoothing:    gives the kind of smoothing which is applied to the polygon, use
  993.                     0 for no smoothing.
  994.         kind:        0 for a normal polygon, 1 for a closed polygon.
  995.     */
  996.     
  997. void ClosePolygon(void);
  998.     /*
  999.         Stops collecting data for a polygon definition, and creates the resulting
  1000.         polyon in the current drawing window.
  1001.     */
  1002.  
  1003.     
  1004. void GroupBegin(void);
  1005. void GroupEnd(void);
  1006.     /*
  1007.         Starts/ends the definition of a group. All drawing taking place after this call
  1008.         will be part of a group. 
  1009.         Call GroupEnd when you are finished with the drawing that belongs to this group.
  1010.     */
  1011.     
  1012.     
  1013. void SetCurrentGraph(long graphID);
  1014.     /*
  1015.         Sets the current graph, that is the graph that will be used for all newly
  1016.         created function-curves and data-sets, and by all routines that access the
  1017.         current graph in general, such as the axes-editing routines.
  1018.         graphID is the graph's identificatioin number, which can be found immediately
  1019.         after a graph is created by using the routine GetCurrentGraph.
  1020.     */
  1021.  
  1022. long GetCurrentGraph(void);
  1023.     /*    
  1024.         returns the graph identification number of the current graph.
  1025.     */
  1026.     
  1027.     
  1028. long GetNextGraph(long graphID);
  1029.     /*
  1030.         returns the identification number of the graph following the given one in
  1031.         pro Fit's private list of existing graphs. The order in this list is not
  1032.         defined and depends on the order of the windows containing the graphs.
  1033.         use graphID=0 to get the ID of the first graph.
  1034.         returns 0 if graphID identifies the last graph, or if graphID!=0 and no graph 
  1035.         with this identification number exists.
  1036.     */
  1037.     
  1038. void GetGraphFrame(double* left,double* top,double* right,double* bottom);
  1039.     /*
  1040.         returns the coordinates of the frame of the current graph.
  1041.     */
  1042.     
  1043. void SetGraphFrame(double left,double top,double right,double bottom);
  1044.     /*
  1045.         changes the frame of the current grapha to match the given coordinates.
  1046.     */
  1047.  
  1048.  
  1049. short GetCurrentAxis(short whichAxis);
  1050.     /*
  1051.         returns the number of the current x or y axis.
  1052.         whichAxis is either xAxis (==0) or yAxis (==1).
  1053.     */
  1054.     
  1055. void SetCurrentAxis(short whichAxis, short axisID);
  1056.     /*
  1057.         sets the current axis that will be used for the next data set or curve, and
  1058.         for all axis-editing calls, such as SetRange, SetAxisPosition, etc.
  1059.     */
  1060.     
  1061. void DeleteAxis(short whichAxis, short axisID);
  1062.     /*
  1063.         deletes the given axis in the current graph.
  1064.     */
  1065.     
  1066. void MakeNewAxis(short whichAxis, double min, double max, short scaling, double position);
  1067.     /*
  1068.         creates a new axis with the given range and scaling in the current graph.
  1069.         position gives the position of the new axis in the coordinate system of the
  1070.         MAIN AXIS perpendicular to it.
  1071.     */
  1072.     
  1073. void SetRange(short whichAxis, double min, double max, short scaling);
  1074.     /*
  1075.         Changes the range and scaling of the current axis to the specified one.
  1076.         (the current axis can be set with the SetCurrentAxis routine)
  1077.     */
  1078.     
  1079. void MakeTicks(short whichAxis, double firstMaj, double distance, short nrMinTicks);
  1080.     /*
  1081.         Lets the current axis recalculate its ticks, based on the new position
  1082.         of the first major tick, tick distance, and number of minor ticks.
  1083.     */
  1084.     
  1085. void SetLabelsFormat(short whichAxis, short format, short decimals);
  1086.     /*
  1087.         Changes the format of the tick labels of the current axis.
  1088.         format:        -1: auto, 0: decimal, 1: auto exponent.
  1089.                     any other number gives the fixed exponent
  1090.         decimals:    number of digits after the decimal point.
  1091.     */
  1092.         
  1093. void ClearLabels(short whichAxis);
  1094.     /*
  1095.         Clears the text contained in all labels of the current axis.
  1096.     */
  1097.     
  1098. void ClearTicks(short whichAxis);
  1099.     /*
  1100.         Clears the ticks list of the current axis, effectively creating
  1101.         an empty list of ticks.
  1102.         Call this routine before defining a set of custom ticks with the
  1103.         AddTick routine.
  1104.     */
  1105.  
  1106.     
  1107. short AddTick(short whichAxis, double tickPos, Boolean isMajor);
  1108.     /*
  1109.         Use this routine to define your own ticks in the current axis.
  1110.         Call ClearTicks before using this routine.
  1111.         given the position of the tic mark and its properties (set isMajor to true
  1112.         to obtain a major tick), AddTick returns the index of the newly created
  1113.         tick in the tick list.
  1114.         It returns 1 for the first tick.
  1115.         This index can be used in the SetLabel/SetLabelText routines to change
  1116.         the label attached to the newly created tick.
  1117.     */
  1118.     
  1119. void SetLabel(short whichAxis, short tickNum, double labelNumber);
  1120.     /*
  1121.         Given a tick index (1<=tickNum<=numberOfTicks), this routine attaches the
  1122.         given label to it by converting labelNumber into a string according to
  1123.         the label-format specified for the current axis.
  1124.         labels can be attached to minor or major ticks in the same way.
  1125.     */
  1126.     
  1127. void SetLabelText(short whichAxis, short tickNum, const Str255 labelText);
  1128.     /*
  1129.         Given a tick index (1<=tickNum<=numberOfTicks), this routine attaches the
  1130.         given label to it by using the text passed in labelText (pascal string!)
  1131.  
  1132.     */
  1133.     
  1134. void SetAxisPosition(short whichAxis, double position);
  1135.     /*
  1136.         Sets the position of the current axis in the coordinate system of the
  1137.         MAIN AXIS perpendicular to it.
  1138.     */
  1139.  
  1140. void SetAxisAttributes(short whichAxis, long flags);
  1141.     /*
  1142.         sets the attributes of the current axis to match "flags"
  1143.         flags:    a set of axis characteristics that can be calculated by summing the
  1144.                 available constants.
  1145.     */
  1146.     
  1147. void SetGraphAttributes(long flags);
  1148.     /*
  1149.         sets the attributes of the current axis to match "flags"
  1150.         flags:    a set of axis characteristics that can be calculated by summing the 
  1151.                 available constants.
  1152.     */
  1153.     
  1154.     
  1155.     
  1156.  
  1157.  
  1158. /********************************************************************************/
  1159. /***************** interaction with other functions and programs *****************/
  1160.  
  1161.         
  1162. void SetParamLimits(short paramNum, double low, double high);
  1163.     /* sets the limits of a parameter (of the currently running function) */
  1164.  
  1165. void SetParamDefaultValue(short paramNum, double value);
  1166.     /* sets the default values of a parameter (of the currently running function) */
  1167.  
  1168. void SetParamName(short paramNum, const Str255 name);
  1169.     /* sets the name of a parameter (of the currently running function) */
  1170.  
  1171. void SetParamDefaults(short paramNum,double value,short mode, const Str255 name, double low, double high);
  1172.     /* sets the default settings of a parameter (of the currently running function) */
  1173.     /* mode is {active, inactive, constant} */
  1174.  
  1175.  
  1176.  
  1177. double CallFunction(const Str255 name,double xvalue);
  1178.     /* calls any of the functions in the func menu by its name */
  1179.  
  1180. short GetNumFunctionParams(const Str255 functionName);
  1181.     /* returns the number of parameters of a function in the func menu */
  1182.  
  1183. short GetFunctionParamMode(const Str255 functionName,short paramIndex);
  1184.     /* returns the mode of a parameter for one of the functions in the func menu */
  1185.  
  1186. void GetFunctionParamName(const Str255 functionName,short paramIndex, Str255 paramName);
  1187.     /* returns the name of a parameter for one of the functions in the func menu */
  1188.  
  1189. double GetFunctionParam(const Str255 functionName,short paramIndex);
  1190.     /* returns the value of a parameter for one of the functions in the func menu */
  1191.  
  1192. void SetFunctionParam(const Str255 functionName,short paramIndex,double value);
  1193.     /* sets a parameter value for a function in the func menu */
  1194.  
  1195. void CallProgram(const Str255 programName);
  1196.     /* calls a program from the User menu */
  1197.     
  1198.     
  1199.  
  1200.  
  1201. /********************************************************************************/
  1202. /****************************** numerical analysis ******************************/
  1203.  
  1204.  
  1205.  
  1206. double Integral(const Str255 functionName, double xmin, double xmax, short numIters);
  1207.     /* calculates the integral of a function in the func menu */
  1208.     /* numIters is the number of iterations (5-15) */
  1209.  
  1210. double Maximum(const Str255 functionName, double xmin, double xmax);
  1211.     /* finds the maximum of a function in the func menu */
  1212.  
  1213. double Minimum(const Str255 functionName, double xmin, double xmax);
  1214.     /* finds the minimum of a function in the func menu */
  1215.  
  1216. double Root(const Str255 functionName, double xmin, double xmax);
  1217.     /* finds the root of a function in the func menu */
  1218.  
  1219. double Derivative(const Str255 functionName, double x, double scale);
  1220.     /* finds the derivative of a function in the func menu */
  1221.     
  1222.  
  1223.  
  1224. void Fit(const Str255 functionName, long xCol, long yCol, long errCol, double errVal, Boolean selectionOnly);
  1225.     /*    
  1226.         runs a non-linear fit for the given function. Generates a run-time
  1227.         error if fit did not converge.
  1228.         xCol, yCol: the x- and y-columns
  1229.         errCol: the error column. Set to 0 if using no error or a constant / percentual error
  1230.         errVal:    if > 0: a constant error   if < 0 (-100..-0) a percentual error
  1231.         selectionOnly: set to true if only selected rows should be fitted 
  1232.     */
  1233.     
  1234. double ChiSquared(void);
  1235.     /*     
  1236.         returns the chi-squared of the last successful fit.
  1237.         Produces a run-time error if no fit information from
  1238.         a successful fit is available 
  1239.     */
  1240.     
  1241. short NumFitParams(void);
  1242.     /*     
  1243.         returns the number of parameters of the last successful fit 
  1244.         (ALL parameters, active, inactive, and constant 
  1245.         returns 0 if no fit information from
  1246.         a successful fit is available 
  1247.     */
  1248.  
  1249.  
  1250. double FittedParams(short paramNum);
  1251.     /*     
  1252.         returns the fitted value of a parameter.  
  1253.         Produces a run-time error if no fit information from
  1254.         a successful fit is available 
  1255.     */
  1256.  
  1257.  
  1258. double ParamSD(short paramNum);
  1259.     /*     
  1260.         returns the standard deviation of a parameter after a successful
  1261.         fit. returns NAN (Not A Number, an invalid real number) if no standard 
  1262.         deviation is available.    
  1263.         Produces a run-time error if no fit information from
  1264.         a successful fit is available  
  1265.     */
  1266.  
  1267. double CovarMatrix(short paramNum1, short paramNum2);
  1268.     /*     
  1269.         returns the elements of the covariance matrix after a successful
  1270.         fit. returns NAN if the corresponding element is not defined because 
  1271.         the parameter was not used for the fit.
  1272.         Produces a run-time error if no fit information from
  1273.         a successful fit is available 
  1274.     */
  1275.  
  1276.  
  1277. double PRandom (void);
  1278.     /* 
  1279.         returns a random double between 0 and 1 
  1280.     */
  1281.     
  1282. short NumberInvalid(double aNum);
  1283.     /* 
  1284.             returns 1 if the argument is not a good number 
  1285.             returns 0 if the argument is a normal, reasonable number 
  1286.     */
  1287.  
  1288.  
  1289. double Erf(double x);
  1290.     /*    
  1291.         returns the error function defined as
  1292.                  x
  1293.           2      /
  1294.         ------   |  exp(-t*t) dt
  1295.           √π     /
  1296.                  0
  1297.         The definition is such that Erf(-inf) = -1, Erf(inf) = 1
  1298.     */
  1299.  
  1300. double Erfc(double x);
  1301.     /*     
  1302.         returns the complementary error function defined as 1-erf(x)
  1303.     */
  1304.  
  1305. void SetFitDefaults(    short     algorithm,             /* algorithm to be used for fitting */
  1306.                         short     yErrDistribution,     /* y error distribution: gaussDistr, doubleExpDistr, lorentzDistr, andrewDistr, tukeyDistr */
  1307.                         short     xErrDistribution,    /* x error distribution: gaussDistr, doubleExpDistr, lorentzDistr, andrewDistr, tukeyDistr */
  1308.                         long      xErrColumn,         /* x error column: >0:column number, 0:none, -1:constant, -2:percent */
  1309.                         double     xErrValue,            /* x error value if constant (xErrColumn=-1) or percentage (xErrColumn=-2) */
  1310.                         double    stopTime);            /* criterium to stop monte carlo fits, does not stop if 0 */
  1311.                                                     /* interpreted as seconds if negativ and as iterations if positive */
  1312.     /*
  1313.         Sets the error column and type, the algorithm and the stopping creteria
  1314.         to be used in all subsequent calls to Fit(..)
  1315.     */
  1316.  
  1317. Boolean Maximize(    const Str255    theFunction,    /* the function name in the func menu */
  1318.                     double    precision,                /* relative tolerance of function values calculated in the simplex */
  1319.                                                     /* algorithm, used as convergence criterium */
  1320.                     Boolean    varyX,                    /* true, if the x-values should be varied, too */
  1321.                     double*    x,                        /* on input: fixed x-value, or starting x-value if varyX is true */
  1322.                                                     /* returned x-value of maximum found */
  1323.                     double*    y);                        /* returned y-value of maximum found */
  1324.     /*
  1325.          Varies the parameters of the function (and x if varyX is true) until
  1326.          the function value reaches a maximum. It is a procedure comparable to
  1327.          fitting. The algorithm used is the Simplex method. 
  1328.     */
  1329.     
  1330. Boolean Minimize(const Str255    theFunction,double precision,Boolean varyX, double*    x,double* y);
  1331.     /*
  1332.          See the comment for "Maximize", which works in the same way. 
  1333.     */
  1334.  
  1335. void SetErrorAnalysis(    double confidence,        /* confidence interval in % (set to 0 to disable error analyis) */
  1336.                         long iterations);        /* number of iterations (set to 0 to disable error analyis) */
  1337.     /*
  1338.          Sets the options for error analysis to be used in the next call to Fit(..) 
  1339.     */
  1340.  
  1341. void ConfidenceInterval(    short i,double* const min, double* const max);
  1342.     /*
  1343.         returns in min,max the confidence interval for parameter i, as calculated after
  1344.         the last fit by the error analysis algorithm.
  1345.          
  1346.         Note that this routine does not return meaningful results if the confidence
  1347.         interval for a given value was not determined, e.g. because this parameter
  1348.         was not active during a fit.
  1349.     */
  1350.  
  1351.  
  1352. Boolean CalcStat(    long column,                 /* column number */
  1353.                     Boolean selRowsOnly,         /* set to true to use only the selected rows */
  1354.                     Boolean withBasics,         /* calculate basic information */
  1355.                     Boolean withSkewAndCurt,     /* calculate skewness and curtosis */
  1356.                     Boolean withMedian);        /* calculate median */
  1357.     /*
  1358.         returns false if an error occurred, true if ok
  1359.          set "column" to:  0 to include all columns.
  1360.                          -1 to use the current selection
  1361.         set the Boolean parameters corresponding to the information you
  1362.         want to calculate.
  1363.         
  1364.         You will use GetBasics, GetSkew, GetMedian to retrieve this information
  1365.     */
  1366.  
  1367. void GetBasics(    long*     count,             /* number of data processed */
  1368.                 double* sum,             /* sum of all these data     */
  1369.                 double* mean,             /* their average            */
  1370.                 double* variance,        /* variance = (stdDev)^2    */
  1371.                 double* stdDev,            /* the standard deviation    */
  1372.                 double* meanAbsDev);    /* mean absolute deviation     */
  1373.     /*
  1374.         returns some results of the last statistics evaluation
  1375.         CalcStat must have been called with the withBasics parameter
  1376.         set to true before this function can be used.
  1377.     */
  1378.  
  1379. void GetSkewAndKurt(    long*     count,         /* number of data processed */
  1380.                         double* mean,         /* 1.moment of distribution: average */
  1381.                                             /* measure the average value of a distribution */
  1382.                         double* variance,    /* 2.moment of distribution: variance */
  1383.                                             /* the square of the standard deviation */
  1384.                         double* skewness,     /* 3.moment of distribution: skewness */
  1385.                                             /* characterizes the asymmetry of a distribution around its mean */
  1386.                         double* kurtosis);    /* 4.moment of distribution: kurtosis */
  1387.                                             /* measure the relative peakedness or flatness of a distribution */
  1388.     /*
  1389.         returns some results of the last statistics evaluation
  1390.         CalcStat must have been called with the withSkewAndCurt parameter
  1391.         set to true before this function can be used.
  1392.     */
  1393.  
  1394.  
  1395. void GetMedian(    long*     count,         /* number of data processed */
  1396.                 double* mean,         /* average over all data */
  1397.                 double* median,        /* the data in the midth of the ordered sequence of data */
  1398.                 double* minimum,     /* smallest (largest negative) value found */
  1399.                 double* maximum);    /* largest value found */
  1400.     /*
  1401.         returns some results of the last statistics evaluation
  1402.         CalcStat must have been called with the withMedian parameter
  1403.         set to true before this function can be used.
  1404.     */
  1405.  
  1406.  
  1407.  
  1408.  
  1409.  
  1410.  
  1411. /********************************************************************************/
  1412. /************************* data access routines *********************************/
  1413.  
  1414.  
  1415.  
  1416. long XColumn (void);
  1417.     /* returns the current x-column of the current data window */
  1418.  
  1419. long YColumn (void);
  1420.     /* returns the current y-column of the current data window */
  1421.  
  1422. long XErrColumn (void);
  1423.     /* returns the current x-error column of the current data window */
  1424.  
  1425. long YErrColumn (void);
  1426.     /* returns the current y-error column of the current data window */
  1427.  
  1428. void SetDefaultCols(long xColumn, long yColumn, long xErrColumn, long yErrColumn);
  1429.     /* 
  1430.         Sets the default x, y, Δx, Δy columns of the current data window. 
  1431.         The default x and y columns are those columns that are shown in the 
  1432.         preview window. 
  1433.         Default columns are also identified by small x, y, Δx, Δy lettering in
  1434.         the column header.
  1435.         Set xErrColumn and yErrColumn to 0 to "undefine" it.
  1436.         Use a negative number if you don't want to change a given default column.
  1437.     */
  1438.  
  1439. long NrRows (void);
  1440.     /* returns the number of rows in the current data window */
  1441.  
  1442. long NrCols (void);
  1443.     /* returns the number of columns in the current data window */
  1444.     
  1445. double GetData(long row,long column);
  1446.     /* returns a value from the current data window */
  1447.  
  1448. void SetData(long row,long column,double value);
  1449.     /* sets a value in the current data window */
  1450.  
  1451. short TestData(long row,long column);
  1452.     /* returns 0 if a value in the current data window is empty */
  1453.     /* returns 1 otherwise */
  1454.  
  1455. void ClearData(long row,long column);
  1456.     /* clears a value from the current data window */
  1457.  
  1458. Rect GetSelection(void);
  1459.     /* returns the selected rows/columns of the current data window */
  1460.  
  1461. void SetColName(long column, const Str255 name);
  1462.     /* sets the name of a column in the current data window */
  1463.             
  1464. void GetColName(Str255 name, long column);
  1465.     /* returns the name of a column in the current data window */
  1466.  
  1467.  
  1468. void SetDataSize(long numberOfRows, long numberOfColumns);
  1469.     /*  
  1470.         Resizes the current data window to match the new number of rows and columns
  1471.         passed as a paramter.
  1472.         Set a parameter to 0 if you don't want to change it.
  1473.         Causes a run-time error if resizing fails.
  1474.     */
  1475.  
  1476. long GetColType(long columnNumber);
  1477.     /*  
  1478.         returns the type of a column of the current data window (colNumber = 1..MaxNrCols)
  1479.         return values:
  1480.             floatColumn:        4 byte floating point format
  1481.             doubleColumn        8 byte floating point format
  1482.             textColumn:            text format
  1483.     */
  1484.  
  1485. void SetColType(long columnNumber, long theType);
  1486.     /*  
  1487.         sets the type of a column of the current data window (colNumber = 1..MaxNrCols)
  1488.         theType:
  1489.             floatColumn:        4 byte floating point format
  1490.             doubleColumn        8 byte floating point format
  1491.             textColumn:            text format
  1492.         Causes a run-time error if conversion failed.
  1493.     */
  1494.  
  1495. Boolean ColEmpty(long columnNumber);
  1496.     /*
  1497.         returns true if the given column doesn't contain any data, false otherwise
  1498.     */
  1499.  
  1500. void SetColWidth(long columnNumber, short width);
  1501.     /*     
  1502.         sets the width of the given column to the number of pixels specified in "width"
  1503.     */
  1504.     
  1505. void SelectCells(long left, long top, long right, long bottom);
  1506.     /*  
  1507.         selects the cells within the given rectangle
  1508.         the coordinates are clipped to the size of the data list
  1509.     */
  1510.  
  1511.  
  1512. void SelectRows(long top, long bottom, Boolean doSelect);
  1513.     /*  
  1514.         selects or deselects the given rows
  1515.         doSelect==true: selects the given rows
  1516.         doSelect==false: deselects the given rows
  1517.         top and bottom are clipped to the size of the list
  1518.         selections outside top/bottom remain as they are
  1519.     */
  1520.  
  1521.  
  1522. Boolean RowSelected(long rowNumber);
  1523.     /*  
  1524.         returns true if at least a cell in the given row is selected,
  1525.         false otherwise, or if the given row is outside the list.
  1526.     */
  1527.  
  1528. Boolean CellSelected(long row, long column);
  1529.     /*  
  1530.         returns true if the given cell is selected
  1531.         run-time error if row/column is outside the list
  1532.     */
  1533.  
  1534.     
  1535. void SetCell(long row,long column, const Str255 s);
  1536.     /*  
  1537.         sets the given cell to the string s.
  1538.         If the given cell is a numeric cell, the string is converted
  1539.         into a number which is used to set the value of the cell.
  1540.     */
  1541.  
  1542.  
  1543. void GetCell(Str255 s, long row,long column);
  1544.     /*  
  1545.         returns the contents of the given cell in the string s.
  1546.         If the cell is a numeric cell, the number is converted into
  1547.         a string and returned in s.
  1548.     */
  1549.  
  1550.  
  1551.  
  1552. void GetDefaultData(DoubleArrayHandle* const xColH,     
  1553.                     DoubleArrayHandle* const yColH,
  1554.                     DoubleArrayHandle* const xErrColH, 
  1555.                     DoubleArrayHandle* const yErrColH,
  1556.                     LongArrayHandle*   const indecesH,
  1557.                     long* arraySize,
  1558.                     Boolean selectedRowsOnly,
  1559.                     DataInfo* const info);
  1560.     /*
  1561.         This routine provides you with a copy of the default x-y data in the
  1562.         current Data window.
  1563.         It allocates memory for the x,y arrays, for the x,y-Error arrays, and
  1564.         for the array that gives the corresponding row numbers in the data window.
  1565.         Then it fills them up with the data. It copies only the data where 
  1566.         both the x and the y cell contain valid numbers.
  1567.         Pass nil for one of these array if you are not interested in it.
  1568.  
  1569.         IndecesH contains, for each x-y data in the data-arrays, the row number in
  1570.         the current data list where that data is found.
  1571.  
  1572.         when selectedRowsOnly is true, only data in selected rows is used to fill up
  1573.         the arrays.
  1574.         
  1575.         The arrays returned by GetDefaultData contain valid data starting from 
  1576.         the element with index 1. The value of the element with index 0 is undefined.
  1577.         The last element has index "arraySize".
  1578.         arraySize is set to zero in case of out-of-memory situations or other problems.
  1579.         
  1580.         Provide a pointer to a data struct of type DataInfo as the last paraemter if
  1581.         you are interested in extra information on the data set.
  1582.         The elements of the DataInfo struct are set by GetDefaultData, and they tell
  1583.         you the boundaries of the x- and y- data, if the data is ordered with
  1584.         x-values growing with the index in the arrays, if any cells in the columns
  1585.         dedicated to the errors of the data points where found empty.
  1586.         See the declaration of the DataInfo structure, above.
  1587.         
  1588.     */
  1589.     
  1590.  
  1591.  
  1592.  
  1593.  
  1594. /********************************************************************************/
  1595. /******************************* miscellaneous *********************************/
  1596.  
  1597.  
  1598.  
  1599. void SetWaitTitle(const Str255 s1);
  1600.     /*
  1601.         writes the string s1 in the window put up by profit while running programs
  1602.         This string serves as a title.
  1603.     */
  1604.  
  1605.  
  1606. void SetWaitText(const Str255 s1, const Str255 s2, const Str255 s3, const Str255 s4, const Str255 s5, const Str255 s6);
  1607.     /*
  1608.         writes the strings s1-s6 in the window put up by profit while running programs
  1609.         in a two columns by three row arrangement:
  1610.         s1        s2
  1611.         s3        s4
  1612.         s5        s6
  1613.         Use an empty string if you don't want to change it.
  1614.     */
  1615.  
  1616.  
  1617. double MarkedX(short i);
  1618. double MarkedY(short i);
  1619.     /*
  1620.     return the x and y coordinate of a marker in the preview window.
  1621.     i is the index of the marker.
  1622.     i = 0 for the reference marker.
  1623.     */
  1624.  
  1625. void MarkedCoord(short i, double* x, double* y);
  1626.     /*
  1627.     returns the x and y coordinates of a marker in the preview window.
  1628.     i is the index of the marker.
  1629.     i = 0 for the reference marker.
  1630.     */
  1631.  
  1632.  
  1633. void DoMenu(const Str255 s);
  1634.     /*
  1635.         executes a menu command, with the same effect as if the command
  1636.         is chosen by hand.
  1637.         s is of the type 'MenuTitle:MenuItem' or 'MenuTitle:SubmenuTitle:MenuItem'
  1638.         Causes a run-time error if such a menu item does not exist.
  1639.         add "$OK" at the end of the string if you want to bypass dialog boxes
  1640.         and simulate a click on ok.
  1641.     */
  1642.  
  1643.     
  1644. short TestStop(void);
  1645.     /* returns 1 if the user interrupted execution (cmd-.), 0 otherwise */
  1646.  
  1647. void StopExecution(void);
  1648.     /* tells pro Fit to stop the execution and not call the external module
  1649.     /* anymore after having the current function call (First, Run, etc.) is completed.*/
  1650.  
  1651. short GetAndSetStatus(short newStatus, Str255 s);
  1652.     /* Returns the present execution status, then sets it to newStatus */
  1653.     /* The status can be: */
  1654.     /*    0: if normal operation */
  1655.     /*    1: if the user interrupted operation */
  1656.     /*    2: if a warning has been posted */
  1657.     /*    3: if a run-time error has been posted */
  1658.     /* Set newStatus to -1 if you don't want to change the current status */
  1659.     /* If you set a status 2 or 3, pass a suitable error or warning message */
  1660.     /* in s It will be shown once your module is finshed. */
  1661.     /* On return, s holds the current message (if status was 2 or 3) */
  1662.     /* Note, that calling StopExecution is equivalent to setting error status */
  1663.     /* to 1 and TestStop returns true if error status is 1 or 3 */
  1664.  
  1665. /********************************************************************************/
  1666. /****************************** advanced routines *******************************/
  1667.  
  1668. /*
  1669.     The following routines are provided for the experienced programmer.
  1670.     They allow for more power and flexibility when writing powerful
  1671.     external modules.
  1672. */
  1673.  
  1674.  
  1675. void HandleEvent(EventRecord* const theEvent);
  1676.     /*
  1677.         Passes theEvent to pro Fit for handling it. Use this call to
  1678.         handle update events when creating your own window.
  1679.     */
  1680.  
  1681. Boolean CancelEvent(EventRecord* const theEvent);
  1682.     /*
  1683.         returns true if theEvent is a key-down event for the
  1684.         escape key or cmd-'.' .
  1685.     */
  1686.  
  1687. void DeactivateProFitWindows(void);
  1688.     /*
  1689.         Deactivates all of pro Fit's windows and disables all menus.
  1690.         Call this routine before showing a window or creating a dialog.
  1691.         Each call to DectivateProFitWindows must be matched with a call to
  1692.         ActivateProFitWindows(void)
  1693.     */
  1694.  
  1695. void ActivateProFitWindows(void);
  1696.     /*
  1697.         Activates pro Fit's frontmost window and enables the menus.
  1698.         Call this routine after closing a window or a dialog.
  1699.         Each call to ActivateProFitWindows must be preceded by a call to
  1700.         DectivateProFitWindows(void)
  1701.     */
  1702.  
  1703. FSSpecPtr GetModuleFile(void);
  1704.     /*
  1705.         Returns a pointer to the FSSpec record of this file of this module.
  1706.     */
  1707.  
  1708. /* advanced data access routines */
  1709.  
  1710. void GetColHandle(long col, Handle* const colH, long* const length, 
  1711.             long* const colType, Boolean forWriting);
  1712.     /*
  1713.         Returns a handle (colH) to the data of the given column. You can read and/or
  1714.         modify the data in the handle. This is much faster than accessing a column's
  1715.         data through GetData/SetData and GetCell/SetCell.  
  1716.         colH:        The handle to the column's data. Can be nil if the corresponding column
  1717.                     is empty.
  1718.         length:     the number of rows held by this column, presently always equal to the number
  1719.                     of rows of the data window
  1720.         forWriting: set to true if you intend to change the contents of the column,
  1721.                     set to false otherwise.
  1722.         colType:    the type of the column (textColumn, floatColumn, doubleColumn)
  1723.         If you change the data in the returned handle, you must subsequently call
  1724.         SetColHandle.
  1725.         Do never call DisposeHandle(colH) — colH is allocated and deallocated by pro Fit.
  1726.  
  1727.         if colType = floatColumn, colH is a handle of type FloatColumnHandle
  1728.               (handle to an array of 4-byte floating point values)
  1729.         if colType = doubleColumn, colH is of type DoubleColumnHandle
  1730.             (handle to an array of 8-byte floating point values)
  1731.         if colType = textColumn, colH is of type TextColumnHandle.
  1732.                (handle to a record of type StringData)
  1733.  
  1734.         Note: For columns of type floatColumn and doubleColumn, the first entry of the
  1735.         array is reserved. The value of the first cell is found in the array element
  1736.         having index 1.
  1737.  
  1738.         Warning: This routine should by used by experienced programmers only.
  1739.         Warning: Accessing text columns in this way is _not_ recommended. The 
  1740.                  definition of the data structure may change in the future.
  1741.  
  1742.         While you are working on the data in colH, you should not call any other
  1743.         routines accessing the data window except GetColumnHandle and SetColumnHandle.
  1744.         When you modify the data in colH, you should avoid calling any pro Fit routines
  1745.         until you have called SetColHandle — if you want to call other pro Fit routines,
  1746.         first make a copy of the data by using HandToHand; once you have made all
  1747.         modifications to the data, call SetColHandle.
  1748.     */
  1749.  
  1750. void SetColHandle(long col, Handle colH);
  1751.     /*
  1752.         Sets a given column to the data in colH. 
  1753.         The organization of the data in colH depends on the data type of the column:
  1754.          if floatColumn, colH is a handle of type FloatColumnHandle
  1755.               (handle to an array of 4-byte floating point values)
  1756.         if doubleColumn, colH is of type DoubleColumnHandle
  1757.             (handle to an array of 8-byte floating point values)
  1758.         if textColumn, colH is of type TextColumnHandle.
  1759.             (handle to a record of type StringData)
  1760.         (To get a column's type, call GetColType)
  1761.  
  1762.         Once you call SetColHandle, the handle becomes property of pro Fit — do
  1763.         not dispose it.
  1764.         colH can either be:
  1765.           - a handle that you allocated yourself. In this case, the Handle's size must be:
  1766.             4*(nrRows+1) for columns of type floatColumn
  1767.             8*(nrRows+1) for columns of type doubleColumn
  1768.             14 + size of all strings for columns of type textColumn
  1769.           - a handle that you obtained from GetColHandle
  1770.          - nil if you want to clear the given column
  1771.  
  1772.         Warning: This routine should by used by experienced programmers only.
  1773.         Warning: Accessing text columns in this way is _not_ recommended. The 
  1774.                  definition of the data structure may change in the future.
  1775.     */
  1776.  
  1777.  
  1778.  
  1779. #endif
  1780.